在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Linux/ 進(jìn)程鎖
信號(hào)
創(chuàng)建目錄權(quán)限
示例程序
進(jìn)程的定義
Hello World進(jìn)程
創(chuàng)建進(jìn)程
進(jìn)程鎖
第四章 項(xiàng)目實(shí)例Run
Nohup命令
PID
前言
系統(tǒng)調(diào)用sendfile
進(jìn)程參數(shù)
參考書籍
后記
進(jìn)程狀態(tài)
本書概述
寫時(shí)復(fù)制(Copy On Write)
Docker簡介
第五章 注意事項(xiàng)
實(shí)現(xiàn)Run
孤兒進(jìn)程概念
共享內(nèi)存
衍生(Spawn)新進(jìn)程
PPID
第三章 進(jìn)程進(jìn)階
退出碼
簡介
進(jìn)程文件
Thanks for reading!
項(xiàng)目學(xué)習(xí)
第一章 進(jìn)程基礎(chǔ)
僵尸進(jìn)程
系統(tǒng)調(diào)用
POSIX簡介
執(zhí)行(Exec)外部程序
文件描述符
進(jìn)程名字
進(jìn)程輸入與輸出
Cgroups
進(jìn)程間通信
查看PID
死鎖概念
進(jìn)程越多越好?
Run項(xiàng)目架構(gòu)
  • 1.
復(fù)制(Fork)進(jìn)程
第二章 Go編程實(shí)例
活鎖概念
守護(hù)(Daemon)進(jìn)程
并發(fā)與并行
捕獲SIGKILL
Namespaces簡介

進(jìn)程鎖

進(jìn)程鎖

這里的進(jìn)程鎖與線程鎖、互斥量、讀寫鎖和自旋鎖不同,它是通過記錄一個(gè)PID文件,避免兩個(gè)進(jìn)程同時(shí)運(yùn)行的文件鎖。

進(jìn)程鎖的作用之一就是可以協(xié)調(diào)進(jìn)程的運(yùn)行,例如crontab使用進(jìn)程鎖解決沖突提到,使用crontab限定每一分鐘執(zhí)行一個(gè)任務(wù),但這個(gè)進(jìn)程運(yùn)行時(shí)間可能超過一分鐘,如果不用進(jìn)程鎖解決沖突的話兩個(gè)進(jìn)程一起執(zhí)行就會(huì)有問題。后面提到的項(xiàng)目實(shí)例Run也有類似的問題,通過進(jìn)程鎖可以解決進(jìn)程間同步的問題。

使用PID文件鎖還有一個(gè)好處,方便進(jìn)程向自己發(fā)停止或者重啟信號(hào)。Nginx編譯時(shí)可指定參數(shù)--pid-path=/var/run/nginx.pid,進(jìn)程起來后就會(huì)把當(dāng)前的PID寫入這個(gè)文件,當(dāng)然如果這個(gè)文件已經(jīng)存在了,也就是前一個(gè)進(jìn)程還沒有退出,那么Nginx就不會(huì)重新啟動(dòng)。進(jìn)程管理工具Supervisord也是通過記錄進(jìn)程的PID來停止或者拉起它監(jiān)控的進(jìn)程的。

使用進(jìn)程鎖

進(jìn)程鎖在特定場景是非常適用的,而操作系統(tǒng)默認(rèn)不會(huì)為每個(gè)程序創(chuàng)建進(jìn)程鎖,那我們該如何使用呢?

其實(shí)要實(shí)現(xiàn)一個(gè)進(jìn)程鎖很簡單,通過文件就可以實(shí)現(xiàn)了。例如程序開始運(yùn)行時(shí)去檢查一個(gè)PID文件,如果文件存在就直接退出,如果文件不存在就創(chuàng)建一個(gè),并把當(dāng)前進(jìn)程的PID寫入文件中。這樣我們很容易可以實(shí)現(xiàn)讀鎖,但是所有流程都需要自己控制。

當(dāng)然根據(jù)DRY(Don't Repeat Yourself)原則,Linux已經(jīng)為我們提供了flock接口。

使用Flock

Flock提供的是advisory lock,也就是建議性的鎖,其他進(jìn)程實(shí)際上也可以讀寫這個(gè)鎖文件。Linux上可以直接使用flock命令,使用C可以調(diào)用原生的flock接口,這里詳細(xì)介紹Go 1.3引入的FcntlFock()。

我們封裝了簡單的接口。

// Control the lock of file.
func fcntlFlock(lockType int16, path ...string) error {
  var err error
  if lockType != syscall.F_UNLCK {
    mode := syscall.O_CREAT | syscall.O_WRONLY
    lockFile, err = os.OpenFile(path[0], mode, 0666)
    if err != nil {
      return err
    }
  }

  lock := syscall.Flock_t{
    Start:  0,
    Len:    1,
    Type:   lockType,
    Whence: int16(os.SEEK_SET),
  }
  return syscall.FcntlFlock(lockFile.Fd(), syscall.F_SETLK, &lock)
}

這樣對進(jìn)程加鎖。

// Lock the file.
func Flock(path string) error {
  return fcntlFlock(syscall.F_WRLCK, path)
}

這樣對進(jìn)程解鎖。

// Unlock the file.
func Funlock(path string) error {
  err := fcntlFlock(syscall.F_UNLCK)
  if err != nil {
    return err
  } else {
    return lockFile.Close()
  }
}

學(xué)習(xí)完進(jìn)程鎖,我們開始了解各種進(jìn)程,如孤兒進(jìn)程、僵尸進(jìn)程。