
操作系统
文章平均质量分 52
sdoyuxuan
高产似母猪 一月20篇~ ~
展开
-
进程与线程基础认知
进程 进程是操作系统的一个基本抽象。它是操作系统对正在运行的程序一种抽象。使程序像独占硬件一般。线程1线程基本概念 线程是进程的执行单元。一个进程可以由多个线程并发执行。它是进程的逻辑控制流。 超线程被称为同时多线程,它允许一个处理器可以同时控制多个控制流。2多线程 多线程指一个进程中有多个线程并行执行。 当处理IO密集型的任务时,由于CPU 和 I/O原创 2017-04-03 14:02:46 · 336 阅读 · 0 评论 -
线程安全与可重入函数
线程安全 当一个函数被多个并发线程反复调用时,它会一直产生正确的结果,那么这个函数就是线程安全的。可重入函数 它是一类重要的线程安全的函数,其特点在于当它们被多个线程调用时,不会引用任何共享数据。它包括显式可重入函数与隐式可重入函数。显式就是在函数中所以数据的引用都是用户栈上的变量,可以显而易见的看出是可重入函数。隐式可重入函数指函数中的形参是通过指针或引用传递的,这些引用都指向了非共享的数据原创 2017-06-17 19:12:48 · 338 阅读 · 0 评论 -
乘法/除法与移位
乘法无符号数,逻辑右移 有符号数,算书右移除法正整数,算术右移,正数补0就行 负整数 , (X+(1<<K)-1)>>K,并不是直接右移,是这个公式计算出来的 可能很多人因为直接算术右移。原创 2017-11-03 18:22:16 · 414 阅读 · 0 评论 -
rpm与yum与源码安装
yum 使用yum命令,根据相应的软件包名字,可自动下载安装,而yum 下载的软件包就是 rpm 软件包, rpm 是Centos 下的一个软件包格式或者说软件包类型,我们可以使用rpm 来管理所有yum下载的软件包源码安装 yum虽然简单方便,但上面的软件的版本过老,如果想体验新版本的软件,我们就不得不去该文件的官网,下载源码,然后编译源码进行安装,源码安装的缺点就是没有yum安装那么方便,但原创 2017-11-19 21:24:50 · 422 阅读 · 0 评论 -
Linux 下 操作进程环境变量的函数和指令
指令 用export 指令可导入环境变量,那么当bash导入后,通过该bash执行的子进程都有该环境变量,因为环境变量是可以被继承的。用法 export KEY=VALUE , key 该环境变量的名字,value 环境变量的值。函数 putenv/setenv , 都可以设置环境变量,它们的区别是: setenv设置环境变量的时候,直接拷贝一份参数 string 字符串,并把拷贝后的原创 2017-11-23 13:42:21 · 1135 阅读 · 0 评论 -
popen / system的区别/为什么vfork 不能直接return 返回
表面上区别 表白上它们的区别是调用system函数输入命令后,system函数就能将结果显示出来,而popen函数并不会将直接返回出来,而是把结果保存在流中,输入从流中读取出结果然后将结果打印出来。实际上 实际上system中它屏蔽了 SIG_INT, SIG_QUIT, 然后阻塞wait 子进程,以此来保证子进程正确的回收。 实际上而执行了popen , 还必须执行 pclose 将这原创 2017-12-03 15:12:00 · 868 阅读 · 0 评论 -
Linux 软/硬链接
软链接 软链接首先是一个符号文件,它的inode号与被链接文件的inode号不同。软链接文件的大小与它被链接对象的名字有关,被链接文件的名字有几个字符,软链接文件大小就多大,它就行windows下的快捷方式。eg abc -> b 则大小为1字节 软链接的列子,我们进在跑的一个进程,我们可以在/proc目录,根据正在跑的进程的一个pid号,找到一个相应的目录,该目录有个叫为 cwd 的一原创 2017-10-20 15:53:55 · 477 阅读 · 0 评论 -
Linux 快速查找某个文件具有相应的内容
小坑 以前一直以为gcc 的 -g 选项在链接的时候加上即可,原来在编译的阶段就要加上。即当需要生成 .o文件的时候,需要加上-g才能调试。gcc -c file -o xxx.o -g ...原创 2018-01-14 18:18:43 · 327 阅读 · 0 评论 -
Linux ext2文件系统
硬盘 在一个硬盘在Linux下,被虚拟成文件。在/dev目录下,实体机是/dev/sd[a-p],虚拟机下是/dev/vd[a-d]。总体来说第一个硬盘被虚拟的文件总体来为/dev/sd[a-p][1-128]。(不过我的虚拟机下的,/dev目录下的文件是/dev/sda)。 硬盘是由分区和磁臂构成。每次写入数据的时候,磁臂旋转到相应的磁道上,对其读写数据。 何为分区呢?列如我的原创 2017-10-24 19:18:04 · 493 阅读 · 0 评论 -
Linux 快速查找某个文件具有相应的内容
find / -name “*.h” | xargs grep “struct mm_struct {“原创 2018-01-07 16:08:38 · 676 阅读 · 0 评论 -
curl: (35) SSL connect error问题处理
解决 无法在服务器使用curl命令访问https域名,原因是nss版本有点旧了,yum -y update nss更新一下,重新curl即可!原创 2018-01-17 10:03:06 · 56514 阅读 · 0 评论 -
gcc 7.2编译安装
1 wget http://mirrors-usa.go-parts.com/gcc/releases/gcc-7.2.0/gcc-7.2.0.tar.gz 先下载安装包2 tar -zxvf gcc-7.2.0.tar.gz3 cd gcc-7.2.04 ./contrib/download_prerequisites 自动安装依赖库5 ./configure原创 2017-10-23 23:43:03 · 2432 阅读 · 0 评论 -
Centos6.5 yum 源配置
/etc/yum.repos.dmv CentOS-Base.repo CentOS-Base.repo.backupwget http://mirrors.aliyun.com/repo/Centos-6.repoyum clean allyum makecache原创 2018-02-08 20:47:22 · 192 阅读 · 0 评论 -
Linux 下权限粘滞位 与 set位
权限粘滞位 权限粘滞位是只针对目录的,主要针对这个情况。列如我们都是相对于这个目录的other,不同的人相对于同一个目录假设都是other,那么只要它们有了这个目录的 写 和 可执行 权限,那么我们就可以对这个文件进行删除。 这就引发了一个问题,假设甲乙都是对这个目录是other,那么凭什么甲有权限删除乙的文件呢?这明显是不对的,所以就有了权限粘滞位,设置了这个后,对于other的用户原创 2018-02-05 14:37:16 · 283 阅读 · 0 评论 -
ELF文件格式与动态链接/静态链接与动态库/静态库 (Linux下 可执行文件的格式)
ELF文件格式 在Linux下,可执行文件/动态库文件/目标文件(可重定向文件)都是同一种文件格式,我们把它称之为ELF文件格式。 虽然它们三个都是ELF文件格式但都各有不同: 可执行文件没有section header table 。 目标文件没有program header table。 动态库文件俩个 header table 都有,因为链接器在链接的时候需要...原创 2017-11-08 17:33:32 · 8283 阅读 · 0 评论 -
free 命令
free \ total used free shared buffers cached Mem 3908800 1149620 2759180 0 53744 866408 -/+ buffers/cache: 229468 3679332 Swap: ...原创 2018-09-17 22:51:40 · 324 阅读 · 0 评论 -
pstack 与 strace
strace strace是可以记录程序系统调用的一个工具,它可以记录该程序系统调用的各个延时情况。-c 统计每一系统调用的所执行的时间,次数和出错的次数等.-d 输出strace关于标准错误的调试信息.-f 跟踪由fork调用所产生的子进程.-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.-F 尝试跟踪vf...原创 2018-11-20 10:40:35 · 702 阅读 · 0 评论 -
Linux的创建文件/目录中的权限参数mode
mkdir/creat/openmode参数是指创建文件时需要创建出什么权限的文件,我原本以为这个跟chmod 这种指令的mode指的同一个东西。777 ,666什么的直接设置 user/group/other的权限,但是我试了结果创建出来的权限很奇怪。 再查找了相关资料后发现。如果不用宏的话。用数字快捷创建时。 分5个模块跟chmod设置权限的方式很相似。 第一个模块是否设置用户ID (0代原创 2017-10-17 13:36:10 · 1755 阅读 · 1 评论 -
Linux 下 /usr/lib和 /usr/local和 /var
/var存放系统运行时的一些变更数据/usr/lib 用户编写程序默认路径库就在这个目录下(usr 指unix software source)/usr/local 一般存放用户自己下载的一些工具/bin 存放基本指令的程序(命令上的除了内建命令之外,所有普通指令都是程序)/usr/bin 用户后期安装的一些软件,如g++/gdb什么的。原创 2017-10-24 11:04:13 · 1758 阅读 · 0 评论 -
Linux /proc 目录
首先/proc 它是一个文件系统,一个虚拟文件系统。它原创 2017-10-24 00:40:45 · 291 阅读 · 0 评论 -
信号量 - SEM_UNDO为什么避免死锁
调整数 : 在Linux下,每个进程都有个信号量调整数,它是int型的一个数字。它通常用来记录对信号量操作中负数的统计。通常我们进行释放资源时,sem_op为正值时,调整值就减去sem_op的绝对值,进行申请资源时sem_op为负值,调整值就加上sem_op的绝对值。所以可以看出这个调整数只是统计了该进程申请的信号量数(即对该信号量进行相对的减少该信号量值的大小)的个数。(当调用semc原创 2017-05-26 08:30:50 · 1565 阅读 · 0 评论 -
子进程的异步等待方式
进程等待 在写多进程程序时,我们创建的子进程要自己回收否则会造成僵尸进程。如果调用waitpid阻塞等待,这会很浪费性能,导致父进程不能做其他的事情去一直阻塞等待子进程,如果选择非阻塞,父进程在执行其他任务时还要不停的去查看子进程是否退出这样太麻烦。 所以我们可以应该子进程退出时会向父进程发送一个SIGCHLD信号,我们应用它编写一个异步等待的程序,这样父进程只需专心做...原创 2017-06-15 22:55:54 · 382 阅读 · 0 评论 -
sleep函数的实现
在linux下,通过调用信号的一系列函数来模拟sleep函数的实现。竞态条件:因时序问题而导致的结果不正确称为竞态条件。普通版本的sleep实现:#include#include#includevoid handle (int x){} unsigned int mysleep(size_t x){ int ret=0; struct sigactio原创 2017-06-16 14:30:25 · 1082 阅读 · 0 评论 -
task_sturct (Linux 的 PCB)
struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ // jincheng zhuang tai void *stack; atomic_t usage; unsigned int flags;原创 2017-04-09 22:48:29 · 620 阅读 · 0 评论 -
守护进程
守护进程 它是特殊的进程。它独立于控制终端并周期性的执行某种任务或等待处理某些中断事件。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止(因为用户注销就代表着会话注销,则这个会话中所有的进程都会终止)。 在Linux系统启动时,会启动很多系统服务进程,这些进程就是守护进程。通常为用户提供服务。我们可以通过ps axj 指令查看到当TPGID(前台进程组id)为-1时都为没原创 2017-06-29 18:28:37 · 428 阅读 · 0 评论 -
GDB 下的多线程多进程调试
多线程 通过set non-stop 来设置当一个线程中断在断点时,整个程序其他线程可以继续运行。 通过info threads 来查看生成的子线程 通过thread 编号可以切换线程多进程 当我们调试多进程程序前,需要设置俩个选项。 follow-fork-mode (默认parent)和 detach-on-fork(默原创 2017-06-08 18:48:36 · 513 阅读 · 0 评论 -
Crond 与 Crontab
Crond Crond是linux系统用来定期执行命令或指定程序任务的一个守护进程。Crond会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作。这个Crond定时任务服务就相当于我们早上使用的闹钟一样。 linux系统中定时任务调度的工作可以分为以下两种情况:1、 linux系统自身定期执行的任务工作:系统周期性自行执行的原创 2017-06-29 22:59:27 · 296 阅读 · 0 评论 -
test
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/epoll.h>#include <stdlib.h>#define SIZE 1024void usege(const char * arg){原创 2017-07-11 18:04:31 · 200 阅读 · 0 评论 -
Linux 下多线程的消费者-生产者模型
消费者-生产者模型 所谓这个模型指在ipc时,由扮演的生产者进程产生数据,由扮演消费者的进程去拿走数据。 这个模型是由3种关系俩种角色一个场景所描述而成。 三种关系指: 消费者-消费者 ---> 互斥 生产者-生产者 ---> 互斥 消费者-生产者 ---> 同步与互斥 俩种角色指: 消费者与生产者原创 2017-06-07 17:29:17 · 790 阅读 · 0 评论 -
Linux线程
线程定位 Linux并不存在用户级线程,只有内核级线程并且内核级线程是用轻量级进程来模拟实现的。所以在Linux层面上,线程是最基本的调度单位,而进程是最基础的承担资源分配的一个单位。俩个所处各自的定位并不相同。在Linux2.6版本之前Linux的pcb中并没有加入tgid(thread group id)字段,所以在2.4版本创建的线程的各自getpid函数所得到的结果都是不一样的,在Linux原创 2017-08-31 16:53:31 · 295 阅读 · 0 评论 -
多线程程序启动多少线程比较好
对于多线程来说启用多少个线程这个问题与程序是什么样的程序有密切的关系。 1. 如果是I/O密集型的话,程序的效率跟I/O阻塞有关,如果I/O阻塞比较少,那么效率就是最高的。 2. 如果是算术密集型的话,程序的线程数和CPU的核数有关,线程数目应与CPU核数密切相关。因为如果CPU数目和线程数目一样的话,这样CPU会尽可能的调度相应的线程,CPU的cache就不会浪费,对于算术密集型经常访问内存,原创 2017-09-17 18:53:49 · 907 阅读 · 0 评论 -
论进程和线程的不同
我们应该去保持一个明确地认识对于线程。太多的人似乎带有对线程和进程的迷惑。以下的讨论并没有反应出当前Linux的目前状态,然后也是一次高级的讨论。 进程和线程仅仅只是一段上下文。 上下文仅仅是所有状态的一个集合。例如CPU状态(如寄存器状态)、MMU状态(页面状态)、权限状态(euid,egid)、还有各种通信状态(已经打开文件的状态,信号handler表的状态)。 传统地来说,进程和线程的不原创 2017-09-17 21:29:50 · 279 阅读 · 0 评论 -
SIGCLD语义
systemv SIGCLD语义虽然SIGCLD默认处理动作是忽略,但是当我们通过signal函数将 SIGCLD显示设为SIG_IGN,该进程的子进程不在保留最终状态,故该进程的子进程将不产生僵尸进程。当我们为SIGCLD注册自定义函数时,如果有终止子进程,系统会立即检查是否有终止的子进程等待被wait,即使当前pending表中没有SIGCLD,也会立即执行SIGCLD的处理函数。SIGC原创 2017-10-26 19:30:25 · 503 阅读 · 0 评论 -
Linux-信号
信号信号是为了操作系统能控制进程正确的运行而产生的一种机制。通常进程产生信号有四种方式。 1 由键盘特殊的组合按键产生,该方式产生的信号发送给一个控制终端的前台作业。 2 由系统调用接口或者命令发出一个信号。(列如kill 命令,abort—异常终止信号) 3 由进程自身错误操作产生的异常导致的信号 4 软件条件产生的信号(列如 alarm , 还有管道中的S原创 2017-10-26 13:49:50 · 331 阅读 · 0 评论 -
-rdynamic(–export-dynamic) 选项
export-dynamic最近写代码用到了 dlopen函数,dlopen 函数里面使用到了 主程序中的一些全局符号(全局变量 或者 函数)。这个时候生成主程序 指定 dlopen函数的连接的 .so 文件的时候,报链接错误。经过咨询大佬得知,生成主程序的时候加上 -export-dynamic 选项就解决了,从现象上可以看到 加了这个选项后 动态库文件就可以使用主程序的内容了。...原创 2019-03-11 16:22:38 · 6174 阅读 · 0 评论