一、课程信息
打卡时间:2022.9.21
课程名称:2022新版编程必备基础,计算机组成原理+操作图片描述系统+网络
章节名称:第6章 操作系统之基础篇和 第7章 操作系统提升篇
讲师: 咚咚呛
二、今日课程
课程内容:线程的创建、主线程与子线程、进程的分类
三、学习心得
线程部分
由于今天刷到有关线程的相关文章,所以稍微学习了课程第7章线程部分的知识。包括线程的创建、主线程与子线程的关系等等。
对于一个进程中的多个线程而言,其对虚拟地址空间既有共享的部分,也有不共享的部分。同时线程之间的资源也有共享的和不共享的。
共享资源:进程ID和父进程ID,进程组ID和会话ID,用户ID和用户组ID
,文件描述符表,信号处置,文件系统的相关信息:文件权限掩码、当前工作目录,虚拟地址空间(除栈、.text)
非共享资源:线程ID,信号掩码,线程特有数据,error变量,实时调度策略和优先级,栈、本地变量和函数调用链接信息
在多线程情况下,线程之间的关系不像进程,线程之间没有父子之分,都是平级的。所谓的"主线程"其实是进程的主函数(main()),main函数在退出时会调用exit()。exit()函数会将进程退出,所有线程也会随之退出。
在进程主函数(main())中调用pthread_exit(),只会使主函数所在的线程(可以说是进程的主线程)退出;而如果是return,编译器将使其调用进程退出的代码(如_exit()),从而导致进程及其所有线程结束运行。
简单演示一下创建子线程
include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/*
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void*), void *arg);
*/
void* callback(void *arg){
printf("child thread...\n");
while(1){
printf("arg=%d.\n",*(int *)arg);
}
return NULL;
}
int main(){
int num = 10;
pthread_t tid;
int ret = pthread_create(&tid, NULL, callback, (void*) &num);
if(ret != 0){
char * errstr = strerror(ret);
printf("error: %s\n",errstr);
}
for(int i=0;i<5;i++){
printf("%d\n",i);
}
int retval;
pthread_exit((void*) &retval);
sleep(1);
return 0;
}
进程部分
进程分为前台进程、后台进程、守护进程
前台进程:被终端shell占用,可以与用户交互的进程
后台进程:与前台进程相对,基于不和用户交互,优先级比前台进程低
守护进程:特殊的后台进程,在系统引导时启动,一直运行在后台,一般进程名字以d结尾的一般都是守护进程。
四、学习截图
共同学习,写下你的评论
评论加载中...
作者其他优质文章