linux多线程总结
时间:2022-03-28 04:56
1 进程环境
C程序总是从main函数开始执行。main函数的原型是:
int main(int argc, char* argv[]);当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。启动例程从内核取得命令行参数和环境变量值,然后调用main函数。
1.1 进程终止
有8种方式能种子进程,其中5种是正常终止,3种是异常终止。
正常:
注意:内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显示或隐式地(通过调用exit)滴啊用_exit或_Exit;进程也可非自愿地有 一个信号使其终止。
1.2 进程内存布局
每个进程所分配的内存由很多部分组成,通常称之为"段"。如下所示:
Figure 1 典型的存储空间安排
2 进程控制
每个进程都有进程ID,其中ID为0的进程是调度进程(交换进程);进程为1的是init进程,并且init进程决不会终止,
2.1 进程的创建
进程的创建可以通过函数fork和vfork进行。
重点注意:
不同的进程拥有不同的地址空间。如在不同的两个进程都拥有100的地址,那么这两个100存放的值是不一样的。
当管道的一端被关闭后,下列两条规则起作用:
- 当读(read)一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示文件结束。
- 如果写(write)一个读端已被关闭的管道,则产生信号SIGPIPE。如果忽略该信号或者捕获该信号并从其处理程序返回,则write返回-1,errno设置为EPIPE。
如下程序:
1 main(){
2 int n,fd[2]; pid_t pid; char line[100];
3 pipe(fd);
4 if((pid=fork()<0)
5 return;
6 else if(pid>0){
7 close(fd[0]);
8 write(fd[1],"hello world\n",12); //向管道中写入数据
9 }
10 else{
11 close(fd[1]);
12 n = read(fd[0],line,12); //从管道中读取数据
13 write(STDOUT_FILENO, lien, n);//输出终端
14 }
15 }
4.1.2 FIFO
FIFO也称为命名管道。与管道不同,通过FIFO不相关的进程也能交换数据。FIFO的使用方式是:先创建(mkfifo),然后使用open打开,接着就能使用I/O系统调用(如read()、write()和close())操作打开的文件描述符了。
int mkfifo(const char* path, mode_t mode);
返回值:若成功,返回0;若出错,返回-1;
进程地址空间
进程标识符和凭证
文件、文件IO和目录
文件系统
信号
定时器
POSIX线程
优先级与调度
资源与CPU时间
进程间通信
杂项
Linux特有
文件系统ID
见注释
ü
setfsuid()、setfsgid()。一旦相应的有效ID发生变化,那么这些ID也会随之改变
timeerfd定时器
ü
见注释
timerfd_create(),子进程继承的文件描述符与父进程指向相同的定时器
能力
见注释
ü
capset()。
功能外延集合
ü
ü
能力安全位(securebits)标志
见注释
ü
执行exec()期间,会保全所有的安全位标志,SECBIT_KEEP_CAPS除外,总是会清除该标志
CPU黏性(affinity)
ü
ü
sched_setaffinity()
SCHED_RESET_ON_FORK
ü
ü
允许的CPU
ü
ü
允许的内存节点
ü
ü
内存策略
ü
ü
文件租约
ü
ü
Fcntl(F_SETLEASE)。子进程从父进程处继承对相同租约的引用
目录变更通知
ü
û
dnotify API,通过fcntl(F_NOTIFY)来实现支持
prctl(PR_SET_DUMPABLE)
见注释
ü
exec()执行期间会设置PR_SET_DUMPABLE标志,自行设置用户或组ID程序的情况除外,此时将清除该标志
prctl(PR_SET_PDEATHIG)
ü
û
prctl(PR_SET_NAME)
û
ü
oom_adj
ü
ü
coredump_filter
ü
ü