手记

【九月打卡】第16天 操作系统基础知识_4

一、课程信息

打卡时间: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结尾的一般都是守护进程。

四、学习截图


0人推荐
随时随地看视频
慕课网APP