![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
Mikoto_10032
这个作者很懒,什么都没留下…
展开
-
竞争与同步(互斥量、读写锁)
竞争与同步 由于线程之间的绝大多数资源都是共享的,当多个线程同时访问一个资源时,可能会出现数据不完整、不一致的情况,此时就需要多个线程协调访问资源(竞争访问,需要用于互斥技术),最终达到数据一致、完整(同步)。互斥量:pthread_mutex_t也叫互斥锁,当互斥量处于锁定状态时,其他线程加锁会处于阻塞状态,只有锁被打开时,被阻塞的线程才能继续执行int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *m原创 2020-12-18 10:19:53 · 313 阅读 · 0 评论 -
实现一个多线程复制的cp命令。
实现一个多线程复制的cp命令。编译:gcc pthread_cp.c -ocp命令行格式:./cp src dest -tn-tn中n代表通过n个线程来分别复制文件#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include &l原创 2020-12-16 20:49:17 · 1118 阅读 · 0 评论 -
详细介绍线程的基本概念、属性
线程的基本概念 1、线程就是进程的执行路线,是进程内部的控件序列(是进程的一部分)。 2、进程系统中的资源单位,而线程是进程的执行单位,进程中至少有一个线程叫主线程。 3、线程是轻量级的,没有自己独立的内存资源,如:代码段、全局数据段、静态数据段、堆区、命令行参数、文件描述符、信号处理函数等。 4、线程唯一拥有的独立资源是栈内存,也就是线程有自己独立的局部变量、线程ID。 5、进程中可以同时拥有多个线程,也就是多个执行路线,其中一个是主线程,进程中的所有线程都在同一个地址空间中活动。原创 2020-12-16 20:46:12 · 1747 阅读 · 0 评论 -
进程间通信详解(管道、共享内存、消息队列、信号量)
进程间通信 进程之间是相互独立的,多个进程之间如果需要协同工作(多进程),那么进程之间就需要通信(数据交换)。进程间通信的分类1、简单数据通信 命令行参数、信号、文件2、传统的进程间通信 管道文件、匿名管道3、XSI通信间通信 共享内存、消息队列、信号量4、网络进程间通信 本地网络:根据网络协议的通信格式,同一个系统内的进程进行通信。 网络通信:根据网络协议的通信格式,不同计算机之间的进程通信。管道通信 管道是UNIX系统最古老的通信方式,早期管道是半双原创 2020-12-16 20:42:46 · 509 阅读 · 0 评论 -
进程与程序(fork、vfork的使用、exit)
进程与程序 程序就是存储在磁盘上的可执行指令、数据的静态实体。 进程就是被操作系统读取、加载到内存中的正在执行的程序。进程的分类 **守护进程:**由系统在开机时通过启动脚本激活的,总处于活动状态,一般运行在后台维护系统的正常运行,进程号为1 **批处理进程:**系统会每隔一段时间集中处理该类进程的相关指令,会有一定的延时,但避免了状态切换的耗时因此执行效率提高。 **交互进程:**在执行时需要用户输入一些数据否则无法进行Linux/UNIX系统查看进程 简答形式:p原创 2020-12-16 20:32:16 · 126 阅读 · 0 评论 -
通过闹钟信号与计时器实现秒表功能(每按一个Ctrl+c记录一下时间)
闹钟信号与计时器unsigned int alarm(unsigned int seconds);功能:让内核在seconds秒后,向调用者发送SIGALRM系统中为进程维护了三个计时器: 真实计时器:程序运行的实际时间 SIGALRM 虚拟计时器:程序在用户态消耗的时间 实用计时器:用户态和内核态所消耗的时间真实计时器 = 实用计时器+睡眠时间int getitimer(int which, struct itimerval *curr_value);功能:获取当前原创 2020-12-16 20:01:50 · 436 阅读 · 0 评论 -
Linux信号详解(处理、中断、捕获、发送)
信号处理中断 暂停当前正在执行的程序,转而执行其他的程序,等任务执行完成后再返回继续执行程序 硬件中断:来自硬件设备产生的中断 软件中断:来自其他程序产生的中断信号 就是由操作系统发出的一种软中断,当操作系统发现进程的一些非法操作,会向进程发送信号信号解释产生条件默认动作SIGHUP(1)连接断开信号如果终端接口检测一个连接断开,则将此信号发送给与该终端相关的控制进程(会话首进程)终止SIGINT(2)终端中断符信号用户按中断键(Ctrl原创 2020-12-16 19:59:39 · 1241 阅读 · 0 评论 -
多线程下生产者与消费者模型、条件变量详解(附栈和队列模拟代码)
生产者与消费者模型生产者:产生数据的进程或线程消费者:使用数据的进程或线程仓库:隔离生产者与消费者的缓冲区,与二者直连相比,避免了相互等待,提高了运行效率问题1:生产快于消费,仓库满,生产者撑死。 生产者降低生产,通知消费 生产者线程进入睡眠,叫醒睡眠的消费者线程问题2:消费快于生产,仓库空,消费者饿死。 消费者降低消费,通知生产 消费者线程进入睡眠,叫醒睡眠的生产者线程条件变量可以让线程睡进去或者醒过来的一个容器,要与互斥锁配合使用pthread_cond_ti原创 2020-12-16 19:55:09 · 156 阅读 · 0 评论 -
信号量(sem)控制访问有限共享资源的线程数
信号量 sem_t就是个资源计数器,用于控制访问有限共享资源的线程数。#include <semaphore.h>int sem_init(sem_t *sem, int pshared, unsigned int value);功能:创建一个信号量sem:获取信号量的IDpshared:一般取0即可,非0表示该信号量可以内存共享方式供多个进程使用,但Linux系统不支持。value:信号量的初始化 int sem_wait(sem_t *sem);功能:信号量减1原创 2020-12-16 19:52:14 · 450 阅读 · 0 评论 -
死锁的问题(四个条件、解决、防止)
死锁问题什么是死锁 多个进程或线程互相以阻塞状态等待对方的资源,在得到所有的对方的资源之前,都不会释放自己现有的资源,这样形成的循环等待现象叫死锁。产生死锁的四个条件 1、资源不共享(资源互斥) 2、占有且等待(请求且保持) 3、资源不可剥夺 4、环路等待解决死锁的方法1、资源剥夺法 将处于死锁状态的其中一个进程挂起,并抢占它的资源,将这些资源分配给其他等待的死锁进程2、撤销进程法 按照优先级、强制杀死部分进程,将其资源释放出来,然后其他等待的死锁原创 2020-12-16 19:49:13 · 466 阅读 · 0 评论 -
动态库(共享库)和静态库的制作与使用
库文件 把源文件编译成二进制的目标文件后,合并打包在一起形成的目标文件的集合叫库文件。静态库 使用静态库时,是把静态库文件的被调用代码复制到调用模块中 1、使用静态库生成出的可执行程序速度快 2、使用静态库生成的可执行程序相对较大 3、当静态库发生变化时,调用者需要重新编译,维护升级麻烦 4、扩展名.a动态库 动态库也叫共享库,使用动态库时,是把动态库文件的被调用代码的位置记录到调用模型中,生成一个跳转指令 1、生成的可执行程序与静态库相比速度慢,而且需要原创 2020-12-16 17:19:50 · 152 阅读 · 0 评论 -
ubuntu下 pthread_mutex_init man中查不到
ubuntu下 pthread_mutex_init man中查不到问题: 如题所述,包括pthread_mutex_init 和 pthread_mutex_lock 这些函数都找不到解决办法: 安装manpages:manpages-posix-dev Mint/Ubuntu:sudo apt-get install manpages-posix-dev结果: 再用man 手册查看上述函数时,就可以看到函数的详细描述,原因是因为man手册中默认没有安装 关于转载 2020-12-15 17:18:37 · 391 阅读 · 2 评论 -
使用vfork、exec系列函数、wait/waited实现system函数的功能
使用vfork、exec系列函数、wait/waited实现system函数的功能#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/wait.h>int _system(const char* cmd){ const char* space = N原创 2020-12-09 18:50:23 · 301 阅读 · 0 评论 -
fork函数和vfork函数的区别(配合exec系列函数使用)
fork创建进程pid_t fork(void);功能:创建一个子进程返回值: 成功则返回两次,子进程返回0,父进程返回子进程ID。 失败则返回一次 -1vfork创建进程pid_t vfork(void);功能:创建子进程返回值: 失败返回 -1 成功返回两次,子进程返回0,父进程返回子进程ID区别:vfork创建的子进程不会复制父进程的代码段资源,而是通过exec系列函数直接加载一个可执行文件启动子进程子进程创建成功前,子进程暂时借用父进程的相关资源来加原创 2020-12-09 18:52:10 · 221 阅读 · 0 评论 -
open函数以及函数中flag常用的宏详解
int open(const char *pathname, int flags, mode_t mode); 功能:打开或创建文件 pathname:文件路径 flag:打开文件时的权限 O_RDONLY 只读 O_WRONLY 只写 O_RDWR 读写 O_CREAT 文件不存在时则创建 O_EXCL 配合创建使用,文件存在时出错 O_TRUNC 清空 O_APPEND 追加mode:创建原创 2020-12-09 18:44:08 · 632 阅读 · 0 评论 -
操作系统之虚拟内存与Linux内存管理
虚拟内存 1、在32位系统下,每个进程都能拥有相互独立的4G虚拟地址空间 2、应用程序中,使用的内存都是虚拟的,无法直接访问物理内存,而需要操作系统把虚拟内存和物理进行映射后使用 3、让应用程序使用虚拟内存的原因是为了保护操作系统的安全,另一方面可以让程序可以使用比物理内存更大地址空间,也就是说操作系统可以把硬盘映射给虚拟内存使用,如果使用没有映射过的虚拟内存会产生段错误 4、4G的地址空间分为两部分: 0~3G 用户空间:不能直接访问内核空间的代码和数据,但可以通过系统切原创 2020-12-11 09:49:06 · 105 阅读 · 0 评论 -
Linux系统硬链接和软链接的区别详解
原贴:http://www.51testing.com/?26162/action_viewspace_itemid_17598.html首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),转载 2020-12-10 19:04:12 · 79 阅读 · 1 评论 -
Linux详细实现ls -l命令
实现ls -l系统ls -l:#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <dirent.h>#include <time.h>#include <pwd.h>#inclu原创 2020-12-07 20:03:12 · 356 阅读 · 0 评论 -
remove函数实现rm -rf
Linux中rm命令行1.rm -rf * 删除当前目录下的所有文件,这个命令很危险,应避免使用。所删除的文件,一般都不能恢复!2.rm -f 其中的,f参数 (f --force ) 忽略不存在的文件,不显示任何信息不会提示确认信息。3.rm 命令删除一个目录中的一个或者多个文件或者目录,只用rm命令不会删除目录,通常文件通常可以恢复rm -rf也不是底层命令,例如windows中则没有此命令,只有相同功能的命令这里我们用递归的方式一层一层检查要删除的目录中中有无文件或目录,如果不是空目录原创 2020-12-07 19:32:39 · 594 阅读 · 6 评论 -
通过fork创建的子进程会拷贝父进程的代码段、数据段、静态数据段、堆、栈、IO缓冲区
通过fork创建的子进程会拷贝父进程的代码段、数据段、静态数据段、堆、栈、IO缓冲区#include <stdio.h>#include <stdlib.h>#include <unistd.h>void func(){ printf("我是函数%s\n",__func__);}int num = 0;int main(){ static int num_s; int* p = malloc(4); pid_t pid转载 2020-12-07 19:17:03 · 1513 阅读 · 0 评论 -
linux操作系统实现chmod命令
实现一个chmod命令#include <stdio.h>#include <unistd.h>#include <sys/stat.h>int main(int argc,const char* argv[]){ if(3 != argc) { puts("User:chmod mmm pathname"); return -1; } int mode = 0; sscanf(argv[1],"%o",&mode); chmod(原创 2020-12-05 11:33:49 · 173 阅读 · 0 评论 -
linux操作系统下的文件相关函数,文件描述符、属性
文件同步应用程序与内核的同步 应用程序使用标准IO写数据时与内核之间有一块默认4K大小的缓冲区,把缓冲区中的数据同步到内核中的方法: 1、遇到\n 2、缓冲区满4K 3、由写入切换到读取 4、调用fflush函数,手动刷新 5、程序结束内核与磁盘的同步 1、一些磁盘进行IO需要通过磁盘中的缓冲区,该缓冲区介于内核与磁盘之间,当我们写入文件时,其实只是写入缓冲区中,直到缓冲区满才将其排队写入磁盘中。 2、延迟写入降低了写操作的次数,提高了写操作的效率,但原创 2020-12-05 11:31:15 · 229 阅读 · 0 评论 -
C实现带覆盖检测的cp命令
实现带覆盖检测的cp命令输入格式: ./cp src dest#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <string.h>#include <getch.h>int main(int argc,const char* argv[]){ if(argc != 3) { puts("User:cp src dest"); puts原创 2020-12-05 11:23:21 · 146 阅读 · 0 评论 -
操作系统文件相关的系统调用,标准IO与系统IO
系统调用定义:操作系统以函数形式提供的一些功能,我们平时所使用的操作系统的功能绝大部分都是通过系统调用实现的。系统调用的运行机制: 这些系统调用都是被封装成了C函数的形式,但使用系统调用的机制与真正的函数调用不同。 普通函数:函数调用是生成一条跳转语句,跳转到函数所在的代码段位置执行,执行完之后再返回。 系统调用:为了系统的安全,不能让应用程序跳转到内核所在的位置执行,而是先开辟一块内核与应用程序共享的区域用于存放系统调用所需要的参数,然后应用程序再给内核发送信号告诉内核要执行的系统调原创 2020-12-03 15:22:55 · 310 阅读 · 0 评论 -
GNU编译器
GNU编译工具1、早起是GNU组织为了编译Linux源码而开发的一款C语言编译器,后期逐渐支持了各种平台的各种编程语言。2、构建C/C++编译过程 预处理–>编译–>汇编–>链接 gcc -E code.c -o code.i gcc -S code.i -> code.s gcc -c code.s -> code.o gcc code.o -> a.out3、支持、产生的文件类型 .h 头文件原创 2020-12-03 15:15:06 · 927 阅读 · 0 评论 -
操作系统的简介(UNIX、Linux)
操作系统 通过学习使用Unix/Linux系统的接口来理解操作系统的运行机制,从而写出质量更高、功能更强的应用程序Unix系统介绍 于1971~1973年在美国贝尔实验室由丹尼斯·里奇、肯·汤普逊合作开发而成,而且顺便升级BCPL语言为C语言。 特点:高安全性、高可靠性、高稳定性,既可以构建大型关键业务系统的商业级服务器,也可以构建面向移动终端、可穿戴设备的嵌入式应用。 Minix是一种基于微内核架构的类Unix计算机操作系统,于1987年由Andrews. Tanenbaum教授发原创 2020-12-03 15:14:01 · 598 阅读 · 0 评论