这是我的问题:调用free或delete是否会将内存释放回"system".我的意思是,系统是否会减少流程的数据段?
让我们考虑Linux上的内存分配器,即ptmalloc.
据我所知(如果我错了请纠正我),ptmalloc维护一个免费的内存块列表,当内存分配请求到来时,它会尝试从这个空闲列表中分配一个内存块(我知道,分配器很多)比这更复杂,但我只是简单地说它)但是,它失败了,它使用say sbrk或brk系统调用从系统获取内存.当一个内存被释放时,该块被放置在空闲列表中.
现在考虑这种情况,在峰值负载时,已经在堆上分配了许多对象.现在当负载减少时,对象是免费的.所以我的问题是:一旦对象被free'd将分配器做一些计算,以发现是否应该保持这个对象在免费的列表或取决于空闲列表的当前大小可能决定给内存回系统即使用sbrk或brk减少进程的数据段.
glibc的文档告诉我,如果分配请求比页面大小大得多,它将使用mmap分配,并且一旦被释放就会直接释放回系统.凉.但是让我说我从来没有要求分配大于50字节的大小,并且我在系统的峰值负载上询问了很多这样的50字节对象.那又怎样?
据我所知(指正请),使用malloc分配的内存将永远不会被释放回过,直到进程结束即分配器只会保持在空闲列表,如果我释放它的系统.但是,这是困扰我的问题是,那么,如果我用一个工具来查看我的进程的内存使用情况(我在Linux上使用PMAP,你们怎么使用呢?),它应该始终显示在高峰负荷使用的内存(因为内存永远不会返回给系统,除非使用mmap分配)?那个进程使用的内存永远不会减少(堆栈内存除外)?是吗 ?
我知道我错过了什么,所以请详细说明这一切.
专家,请清楚我的相关概念.我会很感激.我希望我能够解释我的问题.
我有一些关于*nix系统上POSIX Pthreads的读写锁的问题,例如Linux.
我想知道读写锁的默认偏差是什么,即它是否更喜欢读写,反之亦然?它是否提供一些api来更改此默认行为.
posix pthread是否提供了一些api,以便我们可以更改pthread_rwlock_t以防止作者饥饿?从我所读到的(如果我错了请纠正我),默认实现偏向于读者线程,因此作者线程可能面临饥饿.
我已经从David Butenhof的Programming with Posix threads一书中读到了rw锁的示例实现.
我想知道posix pthreads如何处理编写器线程的饥饿?是否有一些api使用,我们可以设置读写锁的属性,以防止写饥饿(我从来没有听说过)?或者用户是否必须处理此问题?
如果您认为答案是实现定义的,那么请举例说明它是如何在Linux中完成的,因为这就是我要找的东西.
请注意,我只想要一个*nix系统的解决方案.不要以为我很粗鲁,但发布一些特定于Windows的代码对我来说毫无用处.
谢谢大家的帮助和耐心:)
如果我错了,请纠正我.以下是我对信号的理解:
据我所知,信号生成和信号传递是两回事.为了产生信号,OS简单地在过程的过程控制块(PCB)中维持的位阵列中设置一位.每个位对应一个特定信号,当一个位置位时,表示该位对应的信号未决.
交付:在将控制权转移回用户模式的流程之前,内核始终会检查此流程的待处理信号.此检查必须在内核空间中进行,因为进程永远不会忽略某些信号 - 即SIGSTOP和SIGKILL.
那么这是否意味着只有在内核调度该进程(即分配CPU)时才能将信号传递给进程?当一个进程在CPU上实际执行时,它是否可以获得信号?如果是这样,那怎么可能,即该过程如何知道信号正在等待它(因为它在用户模式下执行而无法访问PCB)
假设有多处理器机器,因此存在真正的并行性,即多个进程同时执行.进程P1在cpu 1上执行,进程P2在cpu2上执行,现在进程P2(具有足够的权限)向进程P1发送信号.此信号是立即传送到P1还是在P1因某种原因放弃CPU之后传送,并在稍后由内核重新安排,然后将此信号传送到过程P1.
请不要说这个问题是依赖于实现的.如果您发现正确的答案是实现定义,那么我正在寻找Linux,FreeBSD或您知道的任何*nix平台的答案.
非常感谢您的帮助和耐心:)
问候
拉利
很多次我读/听到由于应用程序进行模式切换(即从用户模式进入内核模式)并且在执行系统调用之后开始在用户模式下执行,因此进行大量系统调用等会产生效率低下.模式再次切换.
我的问题是模式切换的开销是多少?是否cpu缓存失效或tlb条目被刷新或导致开销的情况?
请注意,我问的是模式切换所涉及的开销而不是上下文切换.我知道模式切换和上下文切换是两个不同的事情,我完全了解与上下文切换相关的开销,但我无法理解的是模式切换引起的开销是多少?
如果可能,请提供有关特定*nix平台的一些信息,如Linux,FreeBSD,Solaris等.
问候
拉利
假设以下代码由10个线程执行.
pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)
Run Code Online (Sandbox Code Playgroud)
为了解释的目的,我们可以说线程是T1,T2,T3 ...... T10.我的要求是只要T1或T2或T3(即T1,T2或T3中的任何一个)等待获取锁定,其他线程T4,T5,T6 ...... T10应该无法获取锁定即T1,T2和T3应优先获取相对于其他线程的锁定.
我想这可以通过增加线程T1,T2和T3的优先级来完成
即这是伪代码
if this thread is T1 or T2 or T3
increase its priority
pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)
if this thread is T1 or T2 or T3 decrease it priority to normal
Run Code Online (Sandbox Code Playgroud)
请注意,我想要一个适用于Linux平台的解决方案,并且应该使用pthreads.我真的不关心任何其他平台.
还要注意我真的不想让这3个线程成为实时,我希望它们展示它们的defualt行为(调度和优先级),除了在上面提到的一小段代码中我希望它们始终具有获取锁定的优先权.
我已经阅读了一些关于在Linux中调度策略和调度优先级的手册,但实际上并不能解决:(
这会有用吗?你能帮助我完成上述任务所需的确切pthread API吗?
关心lali
据我所知,在以下场景中调用了一个拷贝构造函数:
1) Pass by value
2) Return by value
3) When you create and initialize a new object with an existing object
Run Code Online (Sandbox Code Playgroud)
这是程序:
#include <iostream>
using namespace std;
class Example
{
public:
Example()
{
cout << "Default constructor called.\n";
}
Example(const Example &ob1)
{
cout << "Copy constructor called.\n";
}
Example& operator=(const Example &ob1)
{
cout << "Assignment operator called.\n";
return *this;
}
~Example()
{
cout<<"\nDtor invoked"<<endl;
}
int aa;
};
Example funct()
{
Example ob2;
ob2.aa=100;
return ob2;
} …Run Code Online (Sandbox Code Playgroud) #include<cstdio>
#include<stdlib.h>
int main()
{
char* ptr=NULL;
printf("%s",ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印(null)作为输出.以上是示例代码.在实际代码中,我得到char*作为函数的返回,我希望打印字符串进行日志记录.但是,NULL也是该函数的有效返回值,所以我想知道在打印字符串之前是否需要进行空检查?
char* ptr=someFuncion();
// do i need the following if statement?
if(ptr!=NULL)
{
printf("%s",ptr);
}
Run Code Online (Sandbox Code Playgroud)
我只想确保输出是相同的,即如果ptr = NULL,那么在所有平台和编译器上输出应该是(null),并且上面的代码(没有if语句)不会在任何C标准兼容平台上崩溃.
总之,上面的代码(没有if语句)标准是否兼容?
谢谢你的帮助和耐心:)
问候
拉利
#include<iostream>
using namespace std;
class Example
{
public:
Example(int a,int b,int c):m_a(a),m_b(b),m_c(c)
{ // Wrong indentation here due to the colon in above line, { should be under E
printf("\nThe 3 argument constructor invoked\n");
} // Wrong indentation again
private:
int m_a;
int m_b;
int m_c;
};
Run Code Online (Sandbox Code Playgroud)
大家好,
我在C++的构造函数初始化列表中的gvim缩进中遇到了一些问题.我在.gvimrc中使用了cindent,即使多次更改我的.gvimrc,我也无法解决这个问题.
一些仁慈的灵魂能给我一些方法来设置它.我试过改变cinoptions和cinwords,但没有什么真正帮助.
我在上面提供的代码段中突出显示了缩进问题.
谢谢你的耐心
关心lali
static void llist_dtor(void *user, void *element)
{
(void)user;
(void)element;
/* Do nothing */
}
Run Code Online (Sandbox Code Playgroud)
它是无操作功能吗?然后为什么要完成铸造?可以将NULL作为其参数之一传递吗?
我使用Vim编辑器进行编程,这是我面临的问题.
我使用多个选项卡同时编辑C++和Python文件,我在.vimrc文件中添加了以下内容
filetype plugin indent on
au filetype python set mp=python3\ %
au filetype cpp set mp=g++\ -Werror\ -Wextra\ -Wall\ -ansi\ -pedantic-errors\ -g\ %
Run Code Online (Sandbox Code Playgroud)
即我想要的是,当我切换到带有Python文件的选项卡并运行时:make,它应该运行:!python3 %,当我切换到带有C++文件的选项卡并运行:make它应该运行:!g++ -Werror -Wextra -Wall -ansi -pedantic-errors -g %
然而它不起作用,每次我切换选项卡并运行时:make,它会尝试执行!g++ -Werror -Wextra -Wall -ansi -pedantic-errors -g %,当我运行:set ft?2个文件(即Python和C++)来检查文件类型是否已被正确识别时,我得到了正确的结果,即python和cpp.
那为什么这个自动命令不起作用?我错过了什么吗?谢谢你的耐心
请注意,这不是作业,我在开始这个新主题之前进行了搜索.我在char数组中得到了一个int?
我正在寻找答案,但在上面的帖子中没有得到任何满意的答案.
这是我的要求:我想在一个字节数组中编码我的数据(比如整数),然后通过网络传输,然后在另一端解码并处理它.
这是编码部分:
const int MAX=5;
uint32_t a = 0xff00ffaa;
char byte_array[1024]; // this is the array to be transferred over the network
char buff[MAX]="";
sprintf(buff,"%4d",a);
memcpy(byte_array,buff,4);
// fill remaining stuff in the byte array and send it over the network
Run Code Online (Sandbox Code Playgroud)
这是解码部分:
const int MAX=5;
char buff[MAX]="";
strncat(buff,byte_array,4)
int i=atoi(buff);
// Work with i
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
1)上述代码是否可移植?我猜是(请纠正我)
2)现在,我希望用3个字节(但整数大小为4)对字节数组进行编码,即假设整数存储0x00ffaabb,我只希望字节数组在第一个索引中具有ff int第0个索引aa而在第一个索引中具有bb第二指数.怎么做?
snprinf 似乎没有用,或者可能是我错过了什么.
实施任何网络协议的人都可以轻松帮助我.我想,解码逻辑仍然有用.(strncat(buff,byte_array,3)后跟atoi函数调用).
这是协议所说的内容:
--------+--------+--------+--------+------------------------------
|Version| 3 byte length | Remaining stuff
--------+--------+--------+--------+------------------------------
版本为1个字节,后跟消息的3个字节长度. …